import face_recognition
from flask import json
import numpy as np

# 提取人脸特征，并进行128维编码
def get_face_encoding(image_file_stream):
    # 从文件流中加载图片
    image = face_recognition.load_image_file(image_file_stream)
    # 尝试获取图片中的人脸特征
    face_encodings = face_recognition.face_encodings(image)
    
    if len(face_encodings) == 0:
        # 如果没有检测到人脸，返回空列表
        return []
    
    # 取第一个检测到的人脸特征
    face_encoding = face_encodings[0]
    # 将特征编码转换为列表
    face_encoding_list = face_encoding.tolist()
    return face_encoding_list


# 识别人脸并返回识别结果
def get_recognize_face(image_file_stream, json_data):
    # 将JSON字符串转换为字典，并且将人脸特征转化为numpy数组
    data = json.loads(json_data)
    known_face_encodings = [np.array(face_encoding) for face_encoding in data.values()]
    known_id = list(data.keys())

    # 尝试获取带识别的人脸特征
    try:
        # 从文件流中加载图片
        image = face_recognition.load_image_file(image_file_stream)
        # 尝试获取图片中的人脸特征
        face_encodings = face_recognition.face_encodings(image)
        if len(face_encodings) == 0:
            # 如果没有检测到人脸，返回空列表
            return ""
    
        # 取第一个检测到的人脸特征
        test_face_encoding = face_encodings[0]
    except Exception as e:
        return ""
    
    # 比较待识别人物的人脸特征与已知人物的人脸特征
    face_distances = face_recognition.face_distance(known_face_encodings, test_face_encoding)
    best_match_index = np.argmin(face_distances)
    match = face_distances[best_match_index] <= 0.4

    if match:
        return f"{known_id[best_match_index]}"
    else:
        return ""
